//Środowisko R dla początkujących

//Rozdział 7. - Przygotowywanie planów bitwy
//John M. Quick

//Przegląd i doprecyzowanie pełnej analizy

//Pierwsze kroki

> #zdefiniuj katalog roboczy R,  używając funkcji setwd(dir)
> setwd("C:/Users/RUser/Strateg/")

> #sprawdź położenie swojego katalogu roboczego
> getwd()
[1] "C:/Users/RUser/Strateg"

//Konfiguracja danych

> #wczytaj zawartość pliku historiaBitew.csv do zmiennej środowiska R
> #plik historiaBitew.csv zawiera dane o 120 bitwach między siłami Shu i Wei, które miały miejsce w przeszłości
> battleHistory <- read.table("historiaBitew.csv", TRUE, ",")

> #użyj funkcji subset(dane, ...), by stworzyć podzbiór danych pochodzących ze zmiennej battleHistory, który powinien zawierać jedynie informacje o bitwach, w których wykorzystano   strategię ataku ogniowego
> subsetFire <- subset(battleHistory, battleHistory$Metoda == "atakOgniowy")

> #wyświetl podzbiór danych dla ataków ogniowych
> subsetFire
     Metoda Ocena UdaneUżycieMetody      Wynik ŻołnierzeShu ŻołnierzeWei CzasTrwaniaDni
91  atakOgniowy    30                 N    Porażka          100         1500              4
92  atakOgniowy   100                 T Zwycięstwo          100         1500              1
93  atakOgniowy    25                 N    Porażka          100         2500              2
94  atakOgniowy    10                 N    Porażka          250         2500             14
95  atakOgniowy    95                 T Zwycięstwo          250         2000              4
96  atakOgniowy    30                 N    Porażka          250         2000             10
97  atakOgniowy    30                 N    Porażka          500         4000             13
98  atakOgniowy    20                 N    Porażka          500         4000             13
99  atakOgniowy    70                 T    Porażka          500         5000              3
100 atakOgniowy    90                 T Zwycięstwo          500         5000              6
101 atakOgniowy    30                 N    Porażka          500         5000             12
102 atakOgniowy    40                 N    Porażka         1000         5000              3
103 atakOgniowy    45                 N    Porażka         1000         5000              1
104 atakOgniowy    15                 N    Porażka         1000        10000             12
105 atakOgniowy    90                 T Zwycięstwo         1000        10000              3
106 atakOgniowy    15                 N    Porażka         1000        10000             10
107 atakOgniowy    20                 N    Porażka         1500        25000              2
108 atakOgniowy    25                 N    Porażka         1500        10000              4
109 atakOgniowy    85                 T Zwycięstwo         1500        10000             10
110 atakOgniowy    85                 T Zwycięstwo         2000         7500              9
111 atakOgniowy    30                 N    Porażka         2000         7500              7
112 atakOgniowy    40                 N    Porażka         2000        25000              2
113 atakOgniowy    40                 N    Porażka         2500        20000              3
114 atakOgniowy    30                 N    Porażka         2500        18000              7
115 atakOgniowy    80                 T Zwycięstwo         2500        12000              4
116 atakOgniowy    15                 N    Porażka         5000        10000             11
117 atakOgniowy    10                 N    Porażka         5000        50000             13
118 atakOgniowy    80                 T Zwycięstwo         7500        25000              4
119 atakOgniowy    50                 T    Porażka         7500        50000              9
120 atakOgniowy    15                 N    Porażka        10000        25000             10

//Użycie danych

> #wygeneruj podsumowanie dla podzbioru dotyczącego ataków ogniowych
> summaryFire <- summary(subsetFire)
> #wyświetl podsumowanie
> summaryFire
Metoda       Ocena        UdaneUżycieMetody        Wynik     ŻołnierzeShu    ŻołnierzeWei   CzasTrwaniaDni  
 atakOgniowy      :30   Min.   : 10.00   N:20              Porażka   :22   Min.   :  100   Min.   : 1500   Min.   : 1.000  
 okrążenie        : 0   1st Qu.: 21.25   T:10              Zwycięstwo: 8   1st Qu.:  500   1st Qu.: 4250   1st Qu.: 3.000  
 walkaBezpośrednia: 0   Median : 30.00                                     Median : 1000   Median : 8750   Median : 6.500  
 zasadzka         : 0   Mean   : 44.67                                     Mean   : 2052   Mean   :12333   Mean   : 6.867  
                        3rd Qu.: 77.50                                     3rd Qu.: 2375   3rd Qu.:16500   3rd Qu.:10.000  
                        Max.   :100.00                                     Max.   :10000   Max.   :50000   Max.   :14.000 

> #zapisz dane kategoryczne w postaci numerycznej,  używając funkcji as.numeric(dane):
> #przekoduj kolumnę Metoda na wartość atakOgniowy = 1
> numericMethodFire <- as.numeric(subsetFire$Metoda) - 1

> #przekoduj kolumnę UdaneUżycieMetody na wartości N = 0 i T = 1
> numericExecutionFire <- as.numeric(subsetFire$UdaneUżycieMetody) - 1

> #przekoduj kolumnę Wynik na wartości Porażka = 0 i Zwycięstwo = 1
> numericResultFire <- as.numeric(subsetFire$Wynik) - 1

> #zapisz informacje z numerycznych kolumn Metoda, UdaneUżycieMetody i Wynik z powrotem w zbiorze danych  o atakach ogniowych
> subsetFire$Metoda <- numericMethodFire
> subsetFire$UdaneUżycieMetody <- numericExecutionFire
> subsetFire$Wynik <- numericResultFire

> #wyświetl numeryczną wersję podzbioru zawierającego dane o atakach ogniowych
> subsetFire
Metoda Ocena UdaneUżycieMetody Wynik ŻołnierzeShu ŻołnierzeWei CzasTrwaniaDni
91       0    30                 0     0          100         1500              4
92       0   100                 1     1          100         1500              1
93       0    25                 0     0          100         2500              2
94       0    10                 0     0          250         2500             14
95       0    95                 1     1          250         2000              4
96       0    30                 0     0          250         2000             10
97       0    30                 0     0          500         4000             13
98       0    20                 0     0          500         4000             13
99       0    70                 1     0          500         5000              3
100      0    90                 1     1          500         5000              6
101      0    30                 0     0          500         5000             12
102      0    40                 0     0         1000         5000              3
103      0    45                 0     0         1000         5000              1
104      0    15                 0     0         1000        10000             12
105      0    90                 1     1         1000        10000              3
106      0    15                 0     0         1000        10000             10
107      0    20                 0     0         1500        25000              2
108      0    25                 0     0         1500        10000              4
109      0    85                 1     1         1500        10000             10
110      0    85                 1     1         2000         7500              9
111      0    30                 0     0         2000         7500              7
112      0    40                 0     0         2000        25000              2
113      0    40                 0     0         2500        20000              3
114      0    30                 0     0         2500        18000              7
115      0    80                 1     1         2500        12000              4
116      0    15                 0     0         5000        10000             11
117      0    10                 0     0         5000        50000             13
118      0    80                 1     1         7500        25000              4
119      0    50                 1     0         7500        50000              9
120      0    15                 0     0        10000        25000             10

> #użyj funkcji cor(dane), aby obliczyć wszystkie korelacje w zbiorze danych ataków ogniowych
> cor(subsetFire)
Metoda      Ocena UdaneUżycieMetody      Wynik ŻołnierzeShu ŻołnierzeWei CzasTrwaniaDni
Metoda                 1         NA                NA         NA           NA           NA             NA
Ocena                 NA  1.0000000        0.91945796  0.9006976  -0.11452122  -0.17682082     -0.4597561
UdaneUżycieMetody     NA  0.9194580        1.00000000  0.8528029   0.08174874   0.02636586     -0.2652026
Wynik                 NA  0.9006976        0.85280287  1.0000000  -0.03270480  -0.15458357     -0.2514287
ŻołnierzeShu          NA -0.1145212        0.08174874 -0.0327048   1.00000000   0.73850610      0.1629878
ŻołnierzeWei          NA -0.1768208        0.02636586 -0.1545836   0.73850610   1.00000000      0.1070097
CzasTrwaniaDni        NA -0.4597561       -0.26520256 -0.2514287   0.16298783   0.10700973      1.0000000
Warning message:
In cor(subsetFire) : the standard deviation is zero

//Projektowanie modelu

> #stwórz model regresji liniowej,  używając w tym celu funkcji glm(formula, data)
> #wyznacz prognozę wyniku bitwy,  wykorzystując zmienną UdaneUżycieMetody
> lmFireRating_Execution <- glm(Ocena ~ UdaneUżycieMetody, data = subsetFire)
> #wygeneruj podsumowanie modelu
> lmFireRating_Execution_Summary <- summary(lmFireRating_Execution)
> #wyświetl podsumowanie modelu
> lmFireRating_Execution_Summary

Call:
glm(formula = Ocena ~ UdaneUżycieMetody, data = subsetFire)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-32.500   -9.500    2.500    6.688   19.250  

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)    
(Intercept)         25.750      2.648   9.725 1.78e-10 ***
UdaneUżycieMetody   56.750      4.586  12.374 7.20e-13 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

(Dispersion parameter for gaussian family taken to be 140.2232)

    Null deviance: 25396.7  on 29  degrees of freedom
Residual deviance:  3926.2  on 28  degrees of freedom
AIC: 237.36

Number of Fisher Scoring iterations: 2

> #zapamiętaj UdaneUżycieMetody jako zmienną niezależną w modelu

> #wyznacz prognozę wyniku bitwy na podstawie informacji o realizacji planów oraz czasie trwania walk
> lmFireRating_ExecutionDuration <- glm(Ocena ~ UdaneUżycieMetody + CzasTrwaniaDni, data = subsetFire)
> #wygeneruj podsumowanie modelu
> lmFireRating_ExecutionDuration_Summary <- summary(lmFireRating_ExecutionDuration)
> #wyświetl podsumowanie modelu
> lmFireRating_ExecutionDuration_Summary

Call:
glm(formula = Ocena ~ UdaneUżycieMetody + CzasTrwaniaDni, data = subsetFire)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-26.515   -6.360    3.052    8.377   12.905  

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)    
(Intercept)        38.1253     4.0899   9.322 6.27e-10 ***
UdaneUżycieMetody  52.9484     3.9815  13.299 2.28e-13 ***
CzasTrwaniaDni     -1.6177     0.4493  -3.600  0.00126 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

(Dispersion parameter for gaussian family taken to be 98.24895)

    Null deviance: 25396.7  on 29  degrees of freedom
Residual deviance:  2652.7  on 27  degrees of freedom
AIC: 227.6

Number of Fisher Scoring iterations: 2

> #zapamiętaj CzasTrwaniaDni jako zmienną niezależną w modelu 

> #wyznacz prognozę wyniku bitwy na podstawie informacji o realizacji planów, czasie trwania walk oraz liczbie walczących żołnierzy Shu i Wei
> lmFireRating_ExecutionDurationSoldiers<- glm(Ocena ~ UdaneUżycieMetody + CzasTrwaniaDni + ŻołnierzeShu + ŻołnierzeWei, data = subsetFire)
> #wygeneruj podsumowanie modelu
> lmFireRating_ExecutionDurationSoldiers_Summary <- summary(lmFireRating_ExecutionDurationSoldiers)
> #wyświetl podsumowanie modelu
> lmFireRating_ExecutionDurationSoldiers_Summary

Call:
glm(formula = Ocena ~ UdaneUżycieMetody + CzasTrwaniaDni + ŻołnierzeShu + 
    ŻołnierzeWei, data = subsetFire)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-19.404   -5.672    2.546    6.168   10.559  

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)    
(Intercept)       41.7874992  3.7429832  11.164 3.32e-11 ***
UdaneUżycieMetody 53.8544374  3.4852025  15.452 2.68e-14 ***
CzasTrwaniaDni    -1.4309681  0.3968799  -3.606  0.00135 ** 
ŻołnierzeShu      -0.0005492  0.0009647  -0.569  0.57426    
ŻołnierzeWei      -0.0003340  0.0001861  -1.795  0.08483 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

(Dispersion parameter for gaussian family taken to be 73.72798)

    Null deviance: 25396.7  on 29  degrees of freedom
Residual deviance:  1843.2  on 25  degrees of freedom
AIC: 220.68

Number of Fisher Scoring iterations: 2

> #usuń z modelu zmienne niezależne ŻołnierzeShu i ŻołnierzeWei 

> #sprawdź, czy istnieje ewentualny efekt interakcji między liczbami walczących żołnierzy Shu i Wei
> wycentruj każdą ze zmiennych poprzez odjęcie ich średnich od każdej z wartości
> centeredShuSoldiersFire <- subsetFire$ŻołnierzeShu - mean(subsetFire$ŻołnierzeShu)
> centeredWeiSoldiersFire <- subsetFire$ŻołnierzeWei - mean(subsetFire$ŻołnierzeWei)
> pomnóż dwie wycentrowane zmienne, by stworzyć zmienną interakcyjną
> interactionSoldiersFire <- centeredShuSoldiersFire * centeredWeiSoldiersFire
> #wyznacz prognozę wyniku bitwy na podstawie informacji o realizacji planów, czasie trwania walk oraz interakcji między liczbami walczących żołnierzy Shu i Wei
> lmFireRating_ExecutionDurationShuWeiInteraction <- glm(Ocena ~ UdaneUżycieMetody + CzasTrwaniaDni + interactionSoldiersFire, data = subsetFire)
> #wygeneruj podsumowanie modelu
> lmFireRating_ExecutionDurationShuWeiInteraction_Summary <- summary(lmFireRating_ExecutionDurationShuWeiInteraction)
> #wyświetl podsumowanie modelu
> lmFireRating_ExecutionDurationShuWeiInteraction_Summary

Call:
glm(formula = Ocena ~ UdaneUżycieMetody + CzasTrwaniaDni + interactionSoldiersFire, 
    data = subsetFire)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-18.233   -7.248    1.466    6.452   10.535  

Coefficients:
                          Estimate Std. Error t value Pr(>|t|)    
(Intercept)              3.737e+01  3.467e+00  10.780 4.34e-11 ***
UdaneUżycieMetody        5.602e+01  3.486e+00  16.071 5.08e-15 ***
CzasTrwaniaDni          -1.237e+00  3.960e-01  -3.125  0.00434 ** 
interactionSoldiersFire -1.273e-07  3.717e-08  -3.424  0.00206 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

(Dispersion parameter for gaussian family taken to be 70.319)

    Null deviance: 25396.7  on 29  degrees of freedom
Residual deviance:  1828.3  on 26  degrees of freedom
AIC: 218.43

Number of Fisher Scoring iterations: 2

> #zapamiętaj interakcję między liczbami walczących żołnierzy Shu i Wei jako zmienną niezależną w modelu

> #użyj funkcji AIC(object, ...), aby porównać modele i wybrać ten, który jest najbardziej odpowiedni 
> #podczas porównywania modeli za pomocą kryterium AIC najniższa wartość oznacza najlepszy statystycznie model
> AIC(lmFireRating_Execution, lmFireRating_ExecutionDuration, lmFireRating_ExecutionDurationSoldiers, lmFireRating_ExecutionDurationShuWeiInteraction)

                                                df      AIC
lmFireRating_Execution                           3 237.3636
lmFireRating_ExecutionDuration                   4 227.6006
lmFireRating_ExecutionDurationSoldiers           6 220.6781
lmFireRating_ExecutionDurationShuWeiInteraction  5 218.4345

> #zgodnie z kryterium AIC  najlepszy okazał się model uwzględniający informacje o realizacji planów, czasie trwania walk oraz efekcie interakcji

//Wdrożenie modelu

> #użyj funkcji coef(object), aby wyodrębnić współczynniki z naszego modelu regresji
> #dzięki użyciu  tylko tych wartości będzie można łatwiej   przeprowadzić modyfikację równania
> coef(lmFireRating_ExecutionDurationShuWeiInteraction)
            (Intercept)       UdaneUżycieMetody          CzasTrwaniaDni interactionSoldiersFire 
           3.737354e+01            5.601947e+01           -1.237476e+00           -1.272603e-07 

> zmodyfikuj równanie regresji w celu wyznaczenia liczby żołnierzy Shu biorących udział w walce
> równanie pierwotne: ocena = 37 + 56 * udane użycie metody - 1.24 * czas trwania - 0.00000013 * interakcja między liczbami żołnierzy
> równanie zmodyfikowane: liczba żołnierzy Shu = (ocena - 37 + 56 * udane użycie metody + 1.24 * czas trwania) / (0.00000013 * - liczba żołnierzy Wei)

> #użyj polecenia function() do stworzenia własnej funkcji w środowisku R
> #polecenie function() ma  następujący format podstawowy:
+   function(argument1, argument2, ..., argumenti  ) { równanie }
> #funkcja użytkownika, która wyznacza maksymalną liczbę żołnierzy Shu biorących udział w bitwie wykorzystując następujące dane  : wymagany wynik, informację o użyciu metody, czas trwania walk oraz liczbę żołnierzy Wei
> functionFireShuSoldiers <- function(rating, execution, 
+ duration, WeiSoldiers)
+ {
+    (rating - 37 - 56 * execution +
+    1.24 * duration) /
+    (0.00000013 * - WeiSoldiers)
+ }

> #wyznacz liczbę żołnierzy Shu przeznaczonych do rozmieszczenia mając następujące dane: rating = 80, duration = 7, success = 1,0 oraz WeiSoldiers = 10000 
> functionFireShuSoldiers(80, 1.0, 7, 10000)
[1] 3323.077

> #funkcja użytkownika, która wyznacza ocenę bitwy wykorzystując  następujące dane: informację o użyciu metody, czas trwania bitwy, liczbę żołnierzy Shu oraz liczbę żołnierzy Wei
> functionFireRating <- function(execution, duration, ShuSoldiers, WeiSoldiers)
+ {
+    37 + 56 * execution -
+    1.24 * duration -
+    0.00000013 * (ShuSoldiers * WeiSoldiers)
+ }

> #co się zdarzy, jeśli zamiast 3323 użyjemy 2500 żołnierzy Shu?
> functionFireRating(1.0, 7, 2500, 10000)
[1] 81.07
> #czy wzrost o 1,07 naszych szans na zwycięstwo jest warty praktycznych korzyści osiągniętych przy użyciu 2500 żołnierzy?

> #własna funkcja, która oblicza koszt (w jednostkach złota) realizacji naszej strategii wykorzystując liczbę żołnierzy Shu, odległość od atakowanego miasta oraz proponowany czas trwania bitwy
> functionGoldCost <- function(ShuSoldiers, distance, duration) 
+ {
+    ShuSoldiers * (distance / 100 + 2 * (duration / 30))
+ }

> #koszt w jednostkach złota ataku ogniowego, który wykorzystuje 2500 żołnierzy Shu przemieszczonych w ciągu 7 dni na odległość 225 kilometrów
> functionGoldCost(2500, 225, 7)
[1] 6791.667

> #zapasy wymagane do zrealizowania naszej strategii ataku ogniowego
> #zużycie jednostek zapasów przez okres 30 dni jest równe liczbie wysłanych żołnierzy
> 2500 * (7/30)
[1] 583.3333

> #koszt wynoszący 6792 jednostek złota jest dużo niższy od naszych zasobów wynoszących 1 000 000 jednostek
> #wymagane zaopatrzenie w liczbie 583 jednostek jest dużo niższe od zasobów wynoszących 1 000 000 jednostek
> #liczba 2500 żołnierzy stanowi jedynie 1,25% liczebności całej armii
> #tak, strategia ataku ogniowego jest wykonalna, biorąc pod uwagę nasze ograniczenia zasobów

//Końcowe kroki

> #zapamiętaj obszar roboczy w bieżącym katalogu roboczym
> save.image("rDlaPoczątkujących_R_07_analizaAtakuOgniowego.RData")

> #zapisz zawartość swojej konsoli R poprzez skopiowanie i wklejenie treści do pliku teksowego

//Czynności wspólne dla wszystkich analiz przeprowadzanych w środowisku R

> #przeanalizuj plik "rDlaPoczątkujących_CzynnościWspólne.txt" dołączony do tej książki, aby poznać pięć kroków wspólych dla wszystkich dobrze zdefiniowanych analiz przeprowadzanych w środowisku R.

